package Cliente;


import Cliente.interface_grafico.InterfaceGrafico;
import Cliente.interface_grafico.MeuPerfil;
import Cliente.interface_grafico.Menu;
import Cliente.interface_grafico.MesaGrafica.Mensagem;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.UIManager;

import mensagem.MIdJogador;
import mensagem.MLogin;
import mensagem.MObject;
import mensagem.MObjectArray;
import mensagem.MSimples;
import mensagem.TipoMensagem;

public class Login extends JFrame{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Container cp;
	private JButton b_login;
	private JButton b_exit;
	private JButton b_registar;
	private JTextField tf_nick;
	private JPasswordField pf_password;
	private JLabel l_nick;
	private JLabel l_password;
	private JProgressBar progressbar;
	private JFrame login;

	private ObjectOutputStream output;
	private ObjectInputStream input;
	private LockLogin lock;
	private int id_jogador;
	private String nickname;

	public Login(ObjectOutputStream out, ObjectInputStream in, LockLogin lock_login){
		super("King - Login");
		this.output = out;
		this.input = in;
		this.lock = lock_login;
		lock.setLock();

		setSize(250, 150);
		setLocation(500, 300);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		b_login = new JButton("Entrar");
		b_exit = new JButton("Sair");
		b_registar = new JButton("Registar");
		tf_nick = new JTextField();
		pf_password = new JPasswordField();
		l_nick = new JLabel("Nickname:");
		l_password = new JLabel("Password:");
		progressbar = new JProgressBar();

		tf_nick.setPreferredSize(new Dimension(100, 20));
		pf_password.setPreferredSize(new Dimension(100, 20));
		progressbar.setPreferredSize(new Dimension(100, 10));
		progressbar.setVisible(false);
		progressbar.setIndeterminate(true);

		cp = getContentPane();
		cp.setLayout(new FlowLayout());

		b_login.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				login.setSize(250, 160);
				progressbar.setVisible(true);
				b_login.setEnabled(false);
				b_registar.setEnabled(false);

				//Verificar a pass por outro Thread para manter o interface activo.
				new Thread(){
					@Override
					public void run(){
						//try{



						id_jogador = isPasswordOk(tf_nick.getText(), new String(pf_password.getPassword()));
						System.out.println("ID_JOGADOR: " + id_jogador);
						if(id_jogador >= 0){

							nickname = tf_nick.getText();

							login.setVisible(false);
							login.dispose();
							login = null;
							lock.unlock();

							//new Tabuleiro(output, id_jogador, interface_grafico);
						}else{
							/*try {
									input.close();
									output.close();
								} catch (IOException ioe) {
									ioe.printStackTrace();
								}*/
							progressbar.setVisible(false);
							login.setSize(250, 150);
							b_login.setEnabled(true);
							b_registar.setEnabled(true);
							JOptionPane.showMessageDialog(b_login, "Login falhou! ", "Login", 1);
						}
						/*}catch(UnknownHostException uhe)	// Pode ser utilizado no Cliente?
						{
							System.out.println("Erro: m�quina desconhecida " + uhe);
							progressbar.setVisible(false);
							login.setSize(250, 150);
							b_login.setEnabled(true);
							b_registrar.setEnabled(true);
							JOptionPane.showMessageDialog(b_login, "Erro: m�quina desconhecida " + uhe, "Erro", 0);*/
						/*}catch(IOException e)
						{
							System.out.println("Erro nos Streams: " + e);
							progressbar.setVisible(false);
							login.setSize(250, 150);
							b_login.setEnabled(true);
							b_registrar.setEnabled(true);
							JOptionPane.showMessageDialog(b_login, "Erro nos Streams: " + e, "Erro", 0);
						}*/


					}
				}.start();
			}	
		}
		);

		b_exit.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		}
		);

		b_registar.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				synchronized(output){
					try {
						output.writeObject(new MSimples(TipoMensagem.CLIENTE_PAISES));
					} catch (IOException e) {
					}

					try {
						new MeuPerfil(output, input, login, (String[])((MObjectArray<String>)input.readObject()).getObject());
					} catch (IOException e) {
						e.printStackTrace();
					} catch (ClassNotFoundException e) {
						e.printStackTrace();
					}
				}
				
			

			}
		});

		JPanel painel1 = new JPanel();
		JPanel painel2 = new JPanel();
		JPanel painel3 = new JPanel();

		painel1.add(l_nick);
		painel1.add(tf_nick);
		painel2.add(l_password);
		painel2.add(pf_password);
		painel3.add(b_login);
		painel3.add(b_registar);
		painel3.add(b_exit);

		cp.add(painel1);
		cp.add(painel2);
		cp.add(painel3);
		cp.add(progressbar);


		login = this;

		this.setVisible(true);
	}



	/**
	 * M�todo que recebe o nickname e password e verifica se os dados est�o correctos, fazendo uma liga��o
	 * ao Servidor
	 * @param nick : Nickname do Jogador
	 * @param password : Password do Jogador
	 * @return : Id do jogador
	 */
	public int isPasswordOk(String nick, String password){
		MSimples resposta = null;
		try {
			synchronized(output){
				output.writeObject(new MLogin(TipoMensagem.CLIENTE_LOGIN, nick, password));
				output.flush();
			}
			synchronized(input){
				resposta = (MSimples)input.readObject();
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} catch (ClassNotFoundException cnfe) {
			cnfe.printStackTrace();
		}

		//Login esta bem?
		if(resposta != null){
			if (resposta.getTipo().equals(TipoMensagem.LOGIN_OK))
				return ((MIdJogador)resposta).getId();
			else if (resposta.getTipo().equals(TipoMensagem.LOGIN_ERRO))
				return -1;
		}
		System.out.println("Resposta do servidor errada");
		return -1;
	}

	public String getNickname(){
		return this.nickname;
	}

	public int getIdJogador(){
		return this.id_jogador;
	}


}